'''
 ex8-4案例: 使用requests+beautifulsoup库爬取七星彩数据
'''
# 导入requests和BeautifulSoup库、re正则库
import requests
from bs4 import BeautifulSoup
import re

# 定义一个公用函数使用requests库获取源代码，唯一的参数为url
def getHTML(url):
    try:
        r = requests.get(url)  # 模拟发送HTTP GET请求
        html = r.text        # 返回文本形式的HTML源代码
        return html          # 返回html代码
    except:
        print("error")  # 如果有异常打印错误

#定义一个函数getQXCData，使用soup的select方法，给定选择器来爬取
def getQXCData(html):
    #定义一个qxcData空列表准备存储该页面的表格数据
    qxcData=[]
    #解析网页源代码
    soup = BeautifulSoup(html,'html.parser')
    #基于选择器使用select方法返回解析列表结果，选择器组合为标签tr和td组合获取七星彩数据，返回列表对象targetd
    targetd = soup.select('tr>td')
    #选择器组合为th获取七星彩表头列名，返回列表对象targeth
    targeth= soup.select('th')
    targeth= soup.select('th')
    #先解析获取表头列名文本内容，使用逗号分隔拼接成字符串
    #爬取到的一等奖、二等奖等所在列时在源代码中是合并列，现在需要将注数和奖金添加到一等奖后，二等奖后，等。
    thead=''
    for item in targeth:
        #将爬取的注数文本去除
        if "注数" in str(item.string):
            continue
        #将爬取的奖金（元）文本去除
        if "奖金（元）" == str(item.string):
            continue
        #如果元素中含有等奖，即一等奖，二等奖，等，在其文本后添加注数、奖金内容
        if "等奖" in str(item.string):
            item = str(item.string)+'注数,'+ str(item.string)+ '奖金(元))'
        else:
            item = item.string
        #拼接成字符串形成表头
        thead+=item+','
    #获取七星彩表格文本内容，存为tdtext数据列表
    tdtext=[item.string for item in targetd]
    #使用正则库，返回带逗号的对象
    strre = re.compile(',')
    #表格一共有18列，按行将行内18个元素拼接成字符串然后存入qxcData列表中
    for num in range(0,len(tdtext),18):
        strRow = ''
        for item in tdtext[num:num+18]:
            #利用正则对象将元素中的匹配项都替换成空格
            item=strre.sub('',str(item))
            strRow+=str(item)+','
        qxcData.append(strRow[:-1])
    #将表头数据字符串、表格数据返回
    return thead,qxcData

# 主函数，调用相关函数爬取到数据并写入文件中
if __name__ == '__main__':
    # 给定体彩网七星彩网站页面url地址
    url = 'https://www.lottery.gov.cn/historykj/history_1.jspx?_ltype=qxc'
    # 调用getHTML函数获取html代码
    html = getHTML(url)
    # 调用getQXCData函数爬取到表头数据和表格数据
    thead,tdata=getQXCData(html)
    # 将爬取的数据存储到qxc20.dat文本文件中
    with open('qxc20.dat', 'w+') as f:
        # 先将表头数据写入
        f.write(thead[:-1])
        # 表头数据写完后加一个换行，准备写表格数据
        f.write('\n')
        # 表格数据按行来写入
        for item in tdata:
            # 写入文件时一行一行写入
            f.write(item)
            # 同时每行写入完成后加一个换行
            f.write('\n')